package com.mx.zb.mng.utils.context;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.ModelMap;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.mx.zb.mng.bo.Module;
import com.mx.zb.mng.bo.ModuleType;
import com.mx.zb.mng.cache.OperatorCaches;
import com.mx.zb.mng.utils.LogManage;

public class LoginInterceptor implements HandlerInterceptor{
	
	Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	OperatorCaches operatorCaches;
	@Autowired 
	LogManage logManage;
	
	private String getPathRole(String path) {
		if(!StringUtils.hasText(path)) {
			return null;
		}
		int idx1= path.indexOf('/',3);
		int idx2 = path.indexOf('/',idx1 + 1);
		if(idx2 == -1) {
			return path.substring(2);
		}else {
			return path.substring(2, idx2);
		}		
	}
	
	private boolean isAccessable(List<ModuleType> mtList, String currenPath) {
		String pat = getPathRole(currenPath);
		for(ModuleType mt: mtList) {
			if(mt.getModuleList()!=null) {
				for(Module m : mt.getModuleList()) {
					if(pat.equals(getPathRole(m.getPath()))) {
						return true;
					}
				}
			}			
		}
		return false;
	}

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // TODO Auto-generated method stub
        logger.debug("------preHandle------");
        //获取session
        HttpSession session = request.getSession();
        //判断用户ID是否存在，不存在就跳转到登录界面
        String operatorId = (String)session.getAttribute("operatorId");
        logger.debug("------operatorId------是"+operatorId);
        if(StringUtils.hasText(operatorId)){
        	String currenPath = request.getRequestURI();
        	List<ModuleType> mtList=operatorCaches.getSideBarList(operatorId);
        	logManage.saveAgentLog(request);
        	if("/p/index".equals(currenPath) || isAccessable(mtList, currenPath)) {
        		ContextThread.set(new ContextInfo(request));
                return true;   
        	}
        }
        
        logger.debug("------:跳转到login页面！");
        response.sendRedirect("/");
        return false;
    }

    /**
     * 该方法将在Controller执行之后，返回视图之前执行
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
    	ModelMap model = modelAndView.getModelMap();
    	HttpSession session = request.getSession();
    	String operatorId = (String)session.getAttribute("operatorId");
    	model.put("mtList", operatorCaches.getSideBarList(operatorId));
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub

    }

}
